home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / 42 ƒ / 42_plugin_ball.c next >
Encoding:
C/C++ Source or Header  |  1999-06-26  |  11.6 KB  |  569 lines  |  [TEXT/CWIE]

  1. #include "42.h"
  2. #include "42_plugin_manager.h"
  3. #include "42_plugin_ball.h"
  4.  
  5. /* plugin definition */
  6.  
  7. forty_two_plugin_api    plugin_ball =
  8. {
  9.     ball_init,        // init
  10.     ball_kill,        // kill
  11.     ball_idle,        // idle1
  12.     nil,            // idle2
  13.     nil,            // click
  14.     ball_ipc,        // ipc
  15.     nil,            // update
  16.     22,                // req_dialog_item
  17.     (GWorldPtr) 0L    // port
  18. };
  19.  
  20.  
  21. vector unsigned short balls[42];
  22. vector unsigned short ball_count = (vector unsigned short)(0);
  23.  
  24. vector unsigned char lines[5];
  25. long state = 0;
  26. Handle ball_data;
  27.  
  28. #define NextLine data -= (*(BallHand)ball_data)->rowbytes/4; data_line--;
  29.  
  30.  
  31. int ball_init(void)
  32. {
  33.     ball_data = NewHandle(sizeof(tBallData));
  34.     
  35.     (*(BallHand)ball_data)->ball_base = (unsigned long *) (**(plugin_ball.port->portPixMap)).baseAddr;
  36.     (*(BallHand)ball_data)->rowbytes = ((**(plugin_ball.port->portPixMap)).rowBytes & 0x3fff) / 4;
  37.     (*(BallHand)ball_data)->color = 0;
  38.     ball_reset();
  39.     state = 0;
  40.     
  41.     lines[0] = (vector unsigned char)(7,1,7,7,5,7,7,7,7,7,7,4,7,1,7,7);
  42.     lines[1] = (vector unsigned char)(5,1,1,1,5,4,4,1,5,5,5,4,4,1,1,4);
  43.     lines[2] = (vector unsigned char)(5,1,7,3,7,7,7,1,7,7,7,7,4,7,6,7);
  44.     lines[3] = (vector unsigned char)(5,1,4,1,1,1,5,1,5,1,5,5,4,5,4,4);
  45.     lines[4] = (vector unsigned char)(7,1,7,7,1,7,7,1,7,1,5,7,7,7,7,4);
  46. }
  47.  
  48. int ball_ipc(int sel, unsigned long msg)
  49. {
  50.     switch(sel)
  51.     {
  52.         case BALL_COLOR:
  53.             ball_color(msg);
  54.             break;
  55.     }
  56. }
  57.  
  58. int ball_idle(void)
  59. {
  60.  
  61.     long i;
  62.     long data_line;
  63.     vector unsigned char * data;
  64.     vector unsigned char shift_one = (vector unsigned char)(1);
  65.     vector unsigned short one = (vector unsigned short)(1);
  66.     vector unsigned short FFs = (vector unsigned short)(-1);
  67.     vector unsigned short zero = (vector unsigned short)(0);
  68.     
  69.     vector unsigned short leftMask = (vector unsigned short)(-1);
  70.     vector unsigned short rightMask = (vector unsigned short)(-1);
  71.     vector unsigned short mask;
  72.  
  73.     vector unsigned short line;
  74.     vector unsigned short theLine;
  75.     vector unsigned short temp;
  76.  
  77.     leftMask= vec_sld(zero,leftMask,15);
  78.     rightMask= vec_sld(rightMask,zero,1);
  79.  
  80.     data = (vector unsigned char *)&(*(BallHand)ball_data)->ball_base[(*(BallHand)ball_data)->rowbytes * 41];
  81.  
  82.     next_ball();
  83.  
  84.     line = (vector unsigned short)(1);
  85.     data_line = 41;
  86.     
  87. // Base Numbers
  88.     for (i=0;i<5;i++)
  89.     {
  90.         theLine = vec_or(balls[data_line],line);
  91.         draw_ball_line( theLine, data);
  92.         NextLine;
  93.     }
  94.  
  95.     temp = vec_or(line,vec_rl(line,one));
  96.     temp = vec_or(temp,vec_rl(line,FFs));
  97.     line = vec_xor(line,temp);        
  98.  
  99. // Draw the middle    
  100.     for (i=0; i< 7; i++)
  101.     {
  102.     
  103.         theLine = vec_or(balls[data_line],temp);
  104.         draw_ball_line( theLine, data);
  105.         NextLine;
  106.  
  107.         theLine = vec_or(balls[data_line],line);
  108.         draw_ball_line( theLine, data);
  109.         NextLine;
  110.  
  111.         theLine = vec_or(balls[data_line],temp);
  112.         draw_ball_line( theLine, data);
  113.         NextLine;
  114.  
  115.         theLine = vec_or(balls[data_line],zero);
  116.         draw_ball_line( theLine, data);
  117.         NextLine;
  118.  
  119.         theLine = vec_or(balls[data_line],zero);
  120.         draw_ball_line( theLine, data);
  121.         NextLine;
  122.  
  123.         leftMask= vec_sld(zero,leftMask,15);
  124.         rightMask= vec_sld(rightMask,zero,1);
  125.         mask = vec_and(leftMask,rightMask);
  126.  
  127.         temp = vec_sld(temp,zero,1);
  128.         temp = vec_and(mask,temp);
  129.         
  130.         line = vec_sld(line,zero,1);
  131.         line = vec_and(mask,line);
  132.     }        
  133.  
  134. // Draw the top two lines
  135.     theLine = vec_or(balls[data_line],zero);
  136.     draw_ball_line( theLine, data);
  137.     NextLine;
  138.     
  139.     theLine = vec_or(balls[data_line],zero);
  140.     draw_ball_line( theLine, data);
  141.     
  142.     (*plugin_ball.update)(&plugin_ball);
  143. }
  144.  
  145. int ball_kill(void)
  146. {
  147.     DisposeHandle(ball_data);
  148. }
  149.  
  150. void ball_color(unsigned long color)
  151. {
  152.     (*(BallHand)ball_data)->color = color;
  153.  
  154. }
  155.  
  156.  
  157. #define lastState 9
  158. short left_shitf[42];
  159.  
  160. void next_ball(void)
  161. {
  162.     long i;
  163.     vector unsigned short zero = (vector unsigned short)(0);
  164.     vector unsigned char one  = (vector unsigned char)(1);
  165.     vector unsigned short newBall  = (vector unsigned short)(0,0,0,3,0x8000,0,0,0);
  166.     vector bool short test_result;
  167.     vector unsigned short temp;
  168.     
  169.     vector unsigned short max = (vector unsigned short)(0x0fff);
  170.     
  171.     if ((state == 7) || (state == 8))
  172.         balls[0] = newBall;
  173.     else
  174.         balls[0] = zero;
  175.  
  176.     for (i=1; i>0; i--)
  177.         switch (state)
  178.         {
  179.             case 0:
  180.                 balls[i] = balls[i-1];
  181.             break;        
  182.             case 1:
  183.             case 2:
  184.             case 3:
  185.             case 4:
  186.             case 5:
  187.             case 6:
  188.             case 7:
  189.                 break;
  190.             case 8:
  191.             case 9:
  192.                 balls[i] = balls[i-1];            
  193.                 break;
  194.         }
  195.  
  196. //        balls[i] = balls[i-1];            
  197.     
  198.     for (i=36; i>1; i--)
  199.     {
  200.         switch (state)
  201.         {
  202.             case 0:
  203.             case 1:
  204.             case 2:
  205.             case 3:
  206.             case 4:
  207.                 if (left_shitf[i])
  208.                     balls[i] = vec_sll(balls[i],one);
  209.                 else
  210.                     balls[i] = vec_srl(balls[i],one);
  211.                 break;
  212.             case 5:
  213.             case 6:
  214.             case 7:
  215.                 if (left_shitf[i])
  216.                     balls[i] = vec_sll(balls[i-1],one);            
  217.                 else
  218.                     balls[i] = vec_srl(balls[i-1],one);            
  219.                 break;
  220.             case 8:
  221.             case 9:
  222.                 balls[i] = balls[i-1];            
  223.                 break;
  224.         }
  225.     }
  226.     state++;
  227.  
  228.     for (i=41; i>0; i--)
  229.     {
  230.         left_shitf[i] = left_shitf[i-1];
  231.     }
  232.     
  233.  
  234.     if (state == 8)
  235.     {
  236.         test_result = vec_cmpeq(zero,balls[36]);
  237.         temp = vec_sel((vector unsigned short)(1),zero,test_result);
  238.         
  239.         ball_count = vec_add(ball_count,temp);
  240.  
  241.         if (!vec_all_gt(max,ball_count))
  242.             ball_count = zero;
  243.         
  244.         
  245.     }
  246.  
  247.  
  248.     if (state > lastState)
  249.     {
  250.         long j;
  251.         vector unsigned char char1, char2;
  252.         state = 0;
  253.         
  254.         for (i=41,j=4; i>36; i--,j--)
  255.         {
  256.             vector unsigned char temp = (vector unsigned char)ball_count;
  257.             vector unsigned char four = (vector unsigned char)(4);
  258.             vector unsigned char one = (vector unsigned char)(1);
  259.             
  260.             char1 = vec_perm(lines[j], lines[j],temp);
  261.             temp =vec_sr(temp,four);
  262.             
  263.             char2 = vec_perm(lines[j], lines[j],temp);
  264.             char2 =vec_sl(char2,four);
  265.             
  266.             char1 = vec_or(char1,char2);
  267.             
  268.             char1 =(vector unsigned char)vec_sl((vector unsigned short)char1,(vector unsigned short)four);
  269.             char1 =(vector unsigned char)vec_sr((vector unsigned short)char1,(vector unsigned short)one);
  270.             
  271.             balls[i] = (vector unsigned short)char1;
  272.         }
  273.         
  274.     }
  275.  
  276.     if (state == (lastState-1))
  277.     {
  278.         left_shitf[0] = Random() & 1;
  279.     }
  280. }
  281.  
  282.  
  283. void ball_reset()
  284. {
  285.     long i;
  286.  
  287.     vector unsigned short zero = (vector unsigned short)(0);
  288.     
  289.     for(i=0;i<42;i++)
  290.         balls[i] = zero;
  291. }
  292.  
  293.  
  294. void draw_ball_line(vector unsigned short line, vector unsigned char * ptr)
  295. {
  296.     long j = 0;
  297.     vector unsigned char cline;
  298.     vector unsigned char t1;
  299.     vector unsigned char t2;
  300.     vector unsigned char t3;
  301.     vector unsigned char t4;
  302.     vector unsigned char t5;
  303.     vector unsigned char out;
  304.     
  305.     vector unsigned char one = (vector unsigned char)(1);
  306.     vector unsigned char shift_1 = (vector unsigned char)(4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0);
  307.     vector unsigned char shift_2 = (vector unsigned char)(2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0);
  308.     vector unsigned char shift_3 = (vector unsigned char)(1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0);
  309.     vector unsigned char white = (vector unsigned char)(-1);
  310.     vector unsigned char color;
  311.     
  312.     color = *(vector unsigned char*)&(*(BallHand)ball_data)->color ;
  313.     
  314.     color = (vector unsigned char)vec_splat((vector unsigned long)color,0);
  315.     
  316.     cline = (vector unsigned char)line;
  317.     
  318.     t1 = vec_mergeh(cline,cline);
  319.     t1 = vec_sr(t1,shift_1);
  320.     {
  321.         t2 = vec_mergeh(t1,t1);
  322.         t2 = vec_sr(t2,shift_2);
  323.         {
  324.             t3 = vec_mergeh(t2,t2);
  325.             t3 = vec_sr(t3,shift_3);
  326.  
  327.             t3 = vec_and(t3,one);
  328.             t3 = (vector unsigned char)vec_cmpeq(t3,one);
  329.             {        
  330.                 t4 = vec_mergeh(t3,t3);
  331.                 {        
  332.                     t5 = vec_mergeh(t4,t4);
  333.                     out = vec_sel(white,color, t5);
  334.                     ptr[j++] = out;
  335.  
  336.                     t5 = vec_mergel(t4,t4);
  337.                     out = vec_sel(white,color, t5);
  338.                     ptr[j++] = out;
  339.                 }
  340.                 t4 = vec_mergel(t3,t3);
  341.                 {        
  342.                     t5 = vec_mergeh(t4,t4);
  343.                     out = vec_sel(white,color, t5);
  344.                     ptr[j++] = out;
  345.  
  346.                     t5 = vec_mergel(t4,t4);
  347.                     out = vec_sel(white,color, t5);
  348.                     ptr[j++] = out;
  349.                 }
  350.             }
  351.  
  352.             t3 = vec_mergel(t2,t2);
  353.             t3 = vec_sr(t3,shift_3);
  354.  
  355.             t3 = vec_and(t3,one);
  356.             t3 = (vector unsigned char)vec_cmpeq(t3,one);
  357.             {        
  358.                 t4 = vec_mergeh(t3,t3);
  359.                 {        
  360.                     t5 = vec_mergeh(t4,t4);
  361.                     out = vec_sel(white,color, t5);
  362.                     ptr[j++] = out;
  363.  
  364.                     t5 = vec_mergel(t4,t4);
  365.                     out = vec_sel(white,color, t5);
  366.                     ptr[j++] = out;
  367.                 }
  368.                 
  369.                 t4 = vec_mergel(t3,t3);
  370.                 {        
  371.                     t5 = vec_mergeh(t4,t4);
  372.                     out = vec_sel(white,color, t5);
  373.                     ptr[j++] = out;
  374.  
  375.                     t5 = vec_mergel(t4,t4);
  376.                     out = vec_sel(white,color, t5);
  377.                     ptr[j++] = out;
  378.                 }
  379.             }
  380.         }
  381.  
  382.         t2 = vec_mergel(t1,t1);
  383.         t2 = vec_sr(t2,shift_2);
  384.         {
  385.             t3 = vec_mergeh(t2,t2);
  386.             t3 = vec_sr(t3,shift_3);
  387.  
  388.             t3 = vec_and(t3,one);
  389.             t3 = (vector unsigned char)vec_cmpeq(t3,one);
  390.             {        
  391.                 t4 = vec_mergeh(t3,t3);
  392.                 {        
  393.                     t5 = vec_mergeh(t4,t4);
  394.                     out = vec_sel(white,color, t5);
  395.                     ptr[j++] = out;
  396.  
  397.                     t5 = vec_mergel(t4,t4);
  398.                     out = vec_sel(white,color, t5);
  399.                     ptr[j++] = out;
  400.                 }
  401.                 
  402.                 t4 = vec_mergel(t3,t3);
  403.                 {        
  404.                     t5 = vec_mergeh(t4,t4);
  405.                     out = vec_sel(white,color, t5);
  406.                     ptr[j++] = out;
  407.  
  408.                     t5 = vec_mergel(t4,t4);
  409.                     out = vec_sel(white,color, t5);
  410.                     ptr[j++] = out;
  411.                 }
  412.             }
  413.             t3 = vec_mergel(t2,t2);
  414.             t3 = vec_sr(t3,shift_3);
  415.  
  416.             t3 = vec_and(t3,one);
  417.             t3 = (vector unsigned char)vec_cmpeq(t3,one);
  418.             {        
  419.                 t4 = vec_mergeh(t3,t3);
  420.                 {        
  421.                     t5 = vec_mergeh(t4,t4);
  422.                     out = vec_sel(white,color, t5);
  423.                     ptr[j++] = out;
  424.  
  425.                     t5 = vec_mergel(t4,t4);
  426.                     out = vec_sel(white,color, t5);
  427.                     ptr[j++] = out;
  428.                 }
  429.                 
  430.                 t4 = vec_mergel(t3,t3);
  431.                 {        
  432.                     t5 = vec_mergeh(t4,t4);
  433.                     out = vec_sel(white,color, t5);
  434.                     ptr[j++] = out;
  435.  
  436.                     t5 = vec_mergel(t4,t4);
  437.                     out = vec_sel(white,color, t5);
  438.                     ptr[j++] = out;
  439.                 }
  440.             }
  441.         }
  442.  
  443.     }
  444.  
  445.     t1 = vec_mergel(cline,cline);
  446.     t1 = vec_sr(t1,shift_1);
  447.     {
  448.         t2 = vec_mergeh(t1,t1);
  449.         t2 = vec_sr(t2,shift_2);
  450.         {
  451.             t3 = vec_mergeh(t2,t2);
  452.             t3 = vec_sr(t3,shift_3);
  453.  
  454.             t3 = vec_and(t3,one);
  455.             t3 = (vector unsigned char)vec_cmpeq(t3,one);
  456.             {        
  457.                 t4 = vec_mergeh(t3,t3);
  458.                 {        
  459.                     t5 = vec_mergeh(t4,t4);
  460.                     out = vec_sel(white,color, t5);
  461.                     ptr[j++] = out;
  462.  
  463.                     t5 = vec_mergel(t4,t4);
  464.                     out = vec_sel(white,color, t5);
  465.                     ptr[j++] = out;
  466.                 }
  467.                 
  468.                 t4 = vec_mergel(t3,t3);
  469.                 {        
  470.                     t5 = vec_mergeh(t4,t4);
  471.                     out = vec_sel(white,color, t5);
  472.                     ptr[j++] = out;
  473.  
  474.                     t5 = vec_mergel(t4,t4);
  475.                     out = vec_sel(white,color, t5);
  476.                     ptr[j++] = out;
  477.                 }
  478.             }
  479.             t3 = vec_mergel(t2,t2);
  480.             t3 = vec_sr(t3,shift_3);
  481.  
  482.             t3 = vec_and(t3,one);
  483.             t3 = (vector unsigned char)vec_cmpeq(t3,one);
  484.             {        
  485.                 t4 = vec_mergeh(t3,t3);
  486.                 {        
  487.                     t5 = vec_mergeh(t4,t4);
  488.                     out = vec_sel(white,color, t5);
  489.                     ptr[j++] = out;
  490.  
  491.                     t5 = vec_mergel(t4,t4);
  492.                     out = vec_sel(white,color, t5);
  493.                     ptr[j++] = out;
  494.                 }
  495.                 
  496.                 t4 = vec_mergel(t3,t3);
  497.                 {        
  498.                     t5 = vec_mergeh(t4,t4);
  499.                     out = vec_sel(white,color, t5);
  500.                     ptr[j++] = out;
  501.  
  502.                     t5 = vec_mergel(t4,t4);
  503.                     out = vec_sel(white,color, t5);
  504.                     ptr[j++] = out;
  505.                 }
  506.             }
  507.         }
  508.         t2 = vec_mergel(t1,t1);
  509.         t2 = vec_sr(t2,shift_2);
  510.         {
  511.             t3 = vec_mergeh(t2,t2);
  512.             t3 = vec_sr(t3,shift_3);
  513.  
  514.             t3 = vec_and(t3,one);
  515.             t3 = (vector unsigned char)vec_cmpeq(t3,one);
  516.             {        
  517.                 t4 = vec_mergeh(t3,t3);
  518.                 {        
  519.                     t5 = vec_mergeh(t4,t4);
  520.                     out = vec_sel(white,color, t5);
  521.                     ptr[j++] = out;
  522.  
  523.                     t5 = vec_mergel(t4,t4);
  524.                     out = vec_sel(white,color, t5);
  525.                     ptr[j++] = out;
  526.                 }
  527.                 
  528.                 t4 = vec_mergel(t3,t3);
  529.                 {        
  530.                     t5 = vec_mergeh(t4,t4);
  531.                     out = vec_sel(white,color, t5);
  532.                     ptr[j++] = out;
  533.  
  534.                     t5 = vec_mergel(t4,t4);
  535.                     out = vec_sel(white,color, t5);
  536.                     ptr[j++] = out;
  537.                 }
  538.             }
  539.             t3 = vec_mergel(t2,t2);
  540.             t3 = vec_sr(t3,shift_3);
  541.  
  542.             t3 = vec_and(t3,one);
  543.             t3 = (vector unsigned char)vec_cmpeq(t3,one);
  544.             {        
  545.                 t4 = vec_mergeh(t3,t3);
  546.                 {        
  547.                     t5 = vec_mergeh(t4,t4);
  548.                     out = vec_sel(white,color, t5);
  549.                     ptr[j++] = out;
  550.  
  551.                     t5 = vec_mergel(t4,t4);
  552.                     out = vec_sel(white,color, t5);
  553.                     ptr[j++] = out;
  554.                 }
  555.                 
  556.                 t4 = vec_mergel(t3,t3);
  557.                 {        
  558.                     t5 = vec_mergeh(t4,t4);
  559.                     out = vec_sel(white,color, t5);
  560.                     ptr[j++] = out;
  561.  
  562.                     t5 = vec_mergel(t4,t4);
  563.                     out = vec_sel(white,color, t5);
  564.                     ptr[j++] = out;
  565.                 }
  566.             }
  567.         }
  568.     }
  569. }